﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MyXMLPrase
{
    class SearchTreeView
    {
        //第一种，递归算法，代码如下：

    public TreeNode FindNode( TreeNode tnParent, string strValue )

    {

        if( tnParent == null ) return null;

        if( tnParent.Text == strValue ) return tnParent;


        TreeNode tnRet = null;

        foreach( TreeNode tn in tnParent.Nodes )

        {

            tnRet = FindNode( tn, strValue );

            if( tnRet != null ) break;

        }

        return tnRet;

    }


//第二种，非递归算法，代码如下：

    //private TreeNode FindNode( TreeNode  tnParent, string strValue )

    //{

    //    if( tnParent == null ) return null;


    //    if( tnParent.Text == strValue ) return tnParent;

    //    else if( tnParent.Nodes.Count == 0 ) return null;


    //    TreeNode tnCurrent, tnCurrentPar;


    //    //Init node

    //    tnCurrentPar = tnParent;

    //    tnCurrent = tnCurrentPar.FirstNode;


    //    while( tnCurrent != null && tnCurrent != tnParent )

    //    {

    //        while( tnCurrent != null )

    //        {

    //            if( tnCurrent.Text == strValue ) return tnCurrent;

    //            else if( tnCurrent.Nodes.Count > 0 ) 

    //            {

    //                //Go into the deepest node in current sub-path

    //                tnCurrentPar = tnCurrent;

    //                tnCurrent = tnCurrent.FirstNode;

    //            }

    //            else if( tnCurrent != tnCurrentPar.LastNode )

    //            {

    //                //Goto next sible node 

    //                tnCurrent = tnCurrent.NextNode;

    //            }

    //            else

    //                break;

    //        }

                

    //        //Go back to parent node till its has next sible node

    //        while( tnCurrent != tnParent && tnCurrent == tnCurrentPar.LastNode )

    //        {

    //            tnCurrent = tnCurrentPar;

    //            tnCurrentPar = tnCurrentPar.Parent;

    //        }


    //        //Goto next sible node

    //        if( tnCurrent != tnParent )

    //            tnCurrent = tnCurrent.NextNode;

    //    }

    //    return null;

    //}


       //程序调用，如下：

       // TreeNode tnRet = null;

       // foreach( TreeNode tn in yourTreeView.Nodes )

       // {

       //     tnRet =  FindNode( tn, yourValue );

       //     if( tnRet != null ) break;

       // }



    }
}
